package com.sun.mvc.controller;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.*;
import java.util.UUID;

// 文件的上传和下载
@Controller
public class FileUpAndDownController {

    // 文件下载
    @RequestMapping("/testDown")
    public ResponseEntity<byte[]> testResponseEntity(HttpSession session) throws IOException {
        //获取ServletContext对象
        ServletContext servletContext = session.getServletContext();
        //获取服务器中文件的真实路径
        String realPath = servletContext.getRealPath("/static/img/1.jpg");
        System.out.println("realPath = " + realPath);
        //创建输入流
        InputStream is = new FileInputStream(realPath);
        //创建字节数组
        //byte[] bytes = new byte[is.available()];
        byte[] buffer = new byte[1024];
        int len = 0;
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        while ((len = is.read(buffer)) != -1){
            out.write(buffer,0,len);
        }
        byte[] bytes = out.toByteArray();
        //将流读到字节数组中
        //is.read(bytes);
        //创建HttpHeaders对象设置响应头信息
        MultiValueMap<String, String> headers = new HttpHeaders();
        //设置要下载方式以及下载文件的名字
        headers.add("Content-Disposition", "attachment;filename=1.jpg");
        String mimeType = servletContext.getMimeType("/static/img/1.jpg");
        headers.add("Content-Type",mimeType);
        //设置响应状态码
        HttpStatus statusCode = HttpStatus.OK;
        //创建ResponseEntity对象
        ResponseEntity<byte[]> responseEntity = new ResponseEntity<byte[]>(bytes, headers, statusCode);
        //关闭输入流
        is.close();
        return responseEntity;
    }

    // 文件上传
    @RequestMapping("/testUp")
    public String testUp(MultipartFile photo,HttpSession session,String username) throws IOException {
        // 可以通过控制器方法的形参获取普通表单项的内容
        System.out.println("username = " + username);

        //获取上传的文件的文件名
        String fileName = photo.getOriginalFilename();
        System.out.println("fileName = " + fileName);

        //处理文件重名问题
        String hzName = fileName.substring(fileName.lastIndexOf("."));
        System.out.println("hzName = " + hzName);
        fileName = UUID.randomUUID() + hzName;
        System.out.println("hzName = " + hzName);

        //获取服务器中photo目录的路径
        ServletContext servletContext = session.getServletContext();
        String photoPath = servletContext.getRealPath("photo");
        System.out.println("photoPath = " + photoPath);
        File file = new File(photoPath);
        if(!file.exists()){
            file.mkdir();
        }
        String finalPath = photoPath + File.separator + fileName;
        System.out.println("finalPath = " + finalPath);
        //实现上传功能，需要使用到 commons-fileupload-1.2.1.jar 及其所依赖的 commons-io-1.4.jar
        photo.transferTo(new File(finalPath));
        return "success";
    }
}
